package busterminal.command.trip;

import busterminal.command.AbstractCommand;
import busterminal.exception.BusinessException;
import busterminal.persistence.TripDAO;
import busterminal.services.ServiceLocator;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.List;

/**
 * Команда для поиска рейсов, осуществляемых в заданный день
 */
public class FindTripByDateCommand extends AbstractCommand {

    /**
     * Имя параметра "Дата осуществления рейса"
     */
    private final static String PARAM_TRIP_DATE = "trip date (in DD.MM.YYYY format)";
    /**
     * Регулярное выражение для проверки корректности ввода даты в формате <code>DD.MM.YYYY</code>
     */
    private static final String CORRECT_DATE_FORMAT = "^((0[1-9]|[12]\\d|3[01])\\.(0[13578]|1[02])\\.((19|[2-9]\\d)\\d{2}))|((0[1-9]|[12]\\d|30)\\.(0[13456789]|1[012])\\.((19|[2-9]\\d)\\d{2}))|((0[1-9]|1\\d|2[0-8])\\.02\\.((19|[2-9]\\d)\\d{2}))|(29\\.02\\.((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)))$";

    /**
     * Конструктор по умолчанию
     */
    public FindTripByDateCommand() {
        super("Find trip by date");
    }

    /**
     * Получить список имён параметров
     * @return список имён параметров
     */
    @Override
    public List<String> getParametersNames() {
        return Arrays.asList(PARAM_TRIP_DATE);
    }

    /**
     * Выполнить команду
     */
    @Override
    public void execute() {
        TripDAO tripDAO = ServiceLocator.getService(TripDAO.class);

        if (!parameters.get(PARAM_TRIP_DATE).trim().matches(CORRECT_DATE_FORMAT)) {
            throw new BusinessException("Incorrect date: '" + parameters.get(PARAM_TRIP_DATE).trim() + "'");
        }
        try {
            System.out.println(tripDAO.findByDate(new SimpleDateFormat("dd.MM.yyyy").parse(parameters.get(PARAM_TRIP_DATE).trim())));
        } catch (Exception e) {
            throw new BusinessException("Incorrect date: '" + parameters.get(PARAM_TRIP_DATE).trim() + "'; " + e.toString(), e);
        }
    }
}
